{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Forecasting one step ahead\n",
    "\n",
    "[Feature Engineering for Time Series Forecasting](https://www.trainindata.com/p/feature-engineering-for-forecasting)\n",
    "\n",
    "In the previous notebook, we lined up the feature engineering steps into a Scikit-learn pipeline and then created all the features with one line of code.\n",
    "\n",
    "In this notebook, we'll examine how to use a train-test split strategy to forecast pollutant concentrations for the next hour.\n",
    "\n",
    "We'll split the data into train and test sets, then train the feature engineering stages and Lasso regression on the train set before evaluating the results on the test set.\n",
    "\n",
    "## Data\n",
    "\n",
    "We will work with the Air Quality Dataset from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/Air+Quality).\n",
    "\n",
    "For instructions on how to download, prepare, and store the dataset, refer to notebook number 3, in the folder \"01-Datasets\" from this repo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "\n",
    "from feature_engine.creation import CyclicalFeatures\n",
    "from feature_engine.datetime import DatetimeFeatures\n",
    "from feature_engine.imputation import DropMissingData\n",
    "from feature_engine.selection import DropFeatures\n",
    "from feature_engine.timeseries.forecasting import (\n",
    "    LagFeatures,\n",
    "    WindowFeatures,\n",
    ")\n",
    "\n",
    "from sklearn.linear_model import Lasso\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.pipeline import Pipeline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Same function we saw in section 2.\n",
    "\n",
    "def load_data():\n",
    "\n",
    "    # Data lives here.\n",
    "    filename = \"../datasets/AirQualityUCI_ready.csv\"\n",
    "\n",
    "    # Load data: only the time variable and CO.\n",
    "    data = pd.read_csv(\n",
    "        filename,\n",
    "        usecols=[\"Date_Time\", \"CO_sensor\", \"RH\"],\n",
    "        parse_dates=[\"Date_Time\"],\n",
    "        index_col=[\"Date_Time\"],\n",
    "    )\n",
    "\n",
    "    # Sanity: sort index.\n",
    "    data.sort_index(inplace=True)\n",
    "\n",
    "    # Reduce data span.\n",
    "    data = data[\"2004-04-01\":\"2005-04-30\"]\n",
    "\n",
    "    # Remove outliers\n",
    "    data = data.loc[(data[\"CO_sensor\"] > 0)]\n",
    "\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CO_sensor</th>\n",
       "      <th>RH</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date_Time</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2004-04-04 00:00:00</th>\n",
       "      <td>1224.0</td>\n",
       "      <td>56.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-04 01:00:00</th>\n",
       "      <td>1215.0</td>\n",
       "      <td>59.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-04 02:00:00</th>\n",
       "      <td>1115.0</td>\n",
       "      <td>62.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-04 03:00:00</th>\n",
       "      <td>1124.0</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-04 04:00:00</th>\n",
       "      <td>1028.0</td>\n",
       "      <td>65.3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     CO_sensor    RH\n",
       "Date_Time                           \n",
       "2004-04-04 00:00:00     1224.0  56.5\n",
       "2004-04-04 01:00:00     1215.0  59.2\n",
       "2004-04-04 02:00:00     1115.0  62.4\n",
       "2004-04-04 03:00:00     1124.0  65.0\n",
       "2004-04-04 04:00:00     1028.0  65.3"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Load data.\n",
    "\n",
    "data = load_data()\n",
    "\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Feature engineering steps\n",
    "\n",
    "The same pipeline from the previous notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Datetime features\n",
    "\n",
    "dtf = DatetimeFeatures(\n",
    "    # the datetime variable\n",
    "    variables=\"index\",\n",
    "    \n",
    "    # the features we want to create\n",
    "    features_to_extract=[\n",
    "        \"month\",\n",
    "        \"week\",\n",
    "        \"day_of_week\",\n",
    "        \"day_of_month\",\n",
    "        \"hour\",\n",
    "        \"weekend\",\n",
    "    ],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Lag features.\n",
    "\n",
    "lagf = LagFeatures(\n",
    "    variables=[\"CO_sensor\", \"RH\"],  # the input variables\n",
    "    freq=[\"1H\", \"24H\"],  # move 1 hr and 24 hrs forward\n",
    "    missing_values=\"ignore\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Window features\n",
    "\n",
    "winf = WindowFeatures(\n",
    "    variables=[\"CO_sensor\", \"RH\"],  # the input variables\n",
    "    window=\"3H\",  # average of 3 previous hours\n",
    "    freq=\"1H\",  # move 1 hr forward\n",
    "    missing_values=\"ignore\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Periodic features\n",
    "\n",
    "cyclicf = CyclicalFeatures(\n",
    "    # The features we want to transform.\n",
    "    variables=[\"month\", \"hour\"],\n",
    "    # Whether to drop the original features.\n",
    "    drop_original=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Drop missing data\n",
    "imputer = DropMissingData()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Drop original time series\n",
    "\n",
    "drop_ts = DropFeatures(features_to_drop=[\"CO_sensor\", \"RH\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Feature engineering pipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "pipe = Pipeline(\n",
    "    [\n",
    "        (\"datetime_features\", dtf),\n",
    "        (\"lagf\", lagf),\n",
    "        (\"winf\", winf),\n",
    "        (\"Periodic\", cyclicf),\n",
    "        (\"dropna\", imputer),\n",
    "        (\"drop_ts\", drop_ts),\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Split data into train and test\n",
    "\n",
    "We will evaluate the performance of the model in a test set consisting of the last month of data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Timestamp('2004-04-04 00:00:00'), Timestamp('2005-04-04 14:00:00'))"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Check data span:\n",
    "\n",
    "data.index.min(), data.index.max()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Due to our 24h lag feature, we need data about the pollutant information at least 24 hours before the first forecasting point in the test set to create input features.\n",
    "\n",
    "Thus, the test set must contain the first forecasting point plus the previous 24 hours."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2005-03-03 00:00:00')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The last month of data begins on 2005-03-4.\n",
    "\n",
    "# But we need 24 hr of prior data to create\n",
    "# the necessary features:\n",
    "\n",
    "pd.Timestamp(\"2005-03-04\") - pd.offsets.Hour(24)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Split the data.\n",
    "\n",
    "# input data\n",
    "X_train = data[data.index < \"2005-03-04\"]\n",
    "X_test = data[data.index >= pd.Timestamp(\"2005-03-04\") - pd.offsets.Hour(24)]\n",
    "\n",
    "# target\n",
    "y_train = data[data.index < \"2005-03-04\"][\"CO_sensor\"]\n",
    "y_test = data[data.index >= pd.Timestamp(\"2005-03-04\") - pd.offsets.Hour(24)][\n",
    "    \"CO_sensor\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Timestamp('2005-03-03 00:00:00'), Timestamp('2005-04-04 14:00:00'))"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let's check that we have the correct data span\n",
    "# in the test set:\n",
    "\n",
    "X_test.index.min(), X_test.index.max()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Train pipeline and model\n",
    "\n",
    "We train the engineering steps and the pipeline utilizing the training set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>month</th>\n",
       "      <th>week</th>\n",
       "      <th>day_of_week</th>\n",
       "      <th>day_of_month</th>\n",
       "      <th>hour</th>\n",
       "      <th>weekend</th>\n",
       "      <th>CO_sensor_lag_1H</th>\n",
       "      <th>RH_lag_1H</th>\n",
       "      <th>CO_sensor_lag_24H</th>\n",
       "      <th>RH_lag_24H</th>\n",
       "      <th>CO_sensor_window_3H_mean</th>\n",
       "      <th>RH_window_3H_mean</th>\n",
       "      <th>month_sin</th>\n",
       "      <th>month_cos</th>\n",
       "      <th>hour_sin</th>\n",
       "      <th>hour_cos</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date_Time</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2004-04-05 00:00:00</th>\n",
       "      <td>4</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1188.0</td>\n",
       "      <td>60.8</td>\n",
       "      <td>1224.0</td>\n",
       "      <td>56.5</td>\n",
       "      <td>1165.666667</td>\n",
       "      <td>58.566667</td>\n",
       "      <td>0.866025</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-05 01:00:00</th>\n",
       "      <td>4</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1065.0</td>\n",
       "      <td>65.8</td>\n",
       "      <td>1215.0</td>\n",
       "      <td>59.2</td>\n",
       "      <td>1149.666667</td>\n",
       "      <td>61.800000</td>\n",
       "      <td>0.866025</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>0.269797</td>\n",
       "      <td>0.962917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-05 02:00:00</th>\n",
       "      <td>4</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>999.0</td>\n",
       "      <td>79.2</td>\n",
       "      <td>1115.0</td>\n",
       "      <td>62.4</td>\n",
       "      <td>1084.000000</td>\n",
       "      <td>68.600000</td>\n",
       "      <td>0.866025</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>0.519584</td>\n",
       "      <td>0.854419</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-05 03:00:00</th>\n",
       "      <td>4</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>911.0</td>\n",
       "      <td>80.0</td>\n",
       "      <td>1124.0</td>\n",
       "      <td>65.0</td>\n",
       "      <td>991.666667</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>0.866025</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>0.730836</td>\n",
       "      <td>0.682553</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2004-04-05 04:00:00</th>\n",
       "      <td>4</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>873.0</td>\n",
       "      <td>81.0</td>\n",
       "      <td>1028.0</td>\n",
       "      <td>65.3</td>\n",
       "      <td>927.666667</td>\n",
       "      <td>80.066667</td>\n",
       "      <td>0.866025</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>0.887885</td>\n",
       "      <td>0.460065</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     month  week  day_of_week  day_of_month  hour  weekend  \\\n",
       "Date_Time                                                                    \n",
       "2004-04-05 00:00:00      4    15            0             5     0        0   \n",
       "2004-04-05 01:00:00      4    15            0             5     1        0   \n",
       "2004-04-05 02:00:00      4    15            0             5     2        0   \n",
       "2004-04-05 03:00:00      4    15            0             5     3        0   \n",
       "2004-04-05 04:00:00      4    15            0             5     4        0   \n",
       "\n",
       "                     CO_sensor_lag_1H  RH_lag_1H  CO_sensor_lag_24H  \\\n",
       "Date_Time                                                             \n",
       "2004-04-05 00:00:00            1188.0       60.8             1224.0   \n",
       "2004-04-05 01:00:00            1065.0       65.8             1215.0   \n",
       "2004-04-05 02:00:00             999.0       79.2             1115.0   \n",
       "2004-04-05 03:00:00             911.0       80.0             1124.0   \n",
       "2004-04-05 04:00:00             873.0       81.0             1028.0   \n",
       "\n",
       "                     RH_lag_24H  CO_sensor_window_3H_mean  RH_window_3H_mean  \\\n",
       "Date_Time                                                                      \n",
       "2004-04-05 00:00:00        56.5               1165.666667          58.566667   \n",
       "2004-04-05 01:00:00        59.2               1149.666667          61.800000   \n",
       "2004-04-05 02:00:00        62.4               1084.000000          68.600000   \n",
       "2004-04-05 03:00:00        65.0                991.666667          75.000000   \n",
       "2004-04-05 04:00:00        65.3                927.666667          80.066667   \n",
       "\n",
       "                     month_sin  month_cos  hour_sin  hour_cos  \n",
       "Date_Time                                                      \n",
       "2004-04-05 00:00:00   0.866025       -0.5  0.000000  1.000000  \n",
       "2004-04-05 01:00:00   0.866025       -0.5  0.269797  0.962917  \n",
       "2004-04-05 02:00:00   0.866025       -0.5  0.519584  0.854419  \n",
       "2004-04-05 03:00:00   0.866025       -0.5  0.730836  0.682553  \n",
       "2004-04-05 04:00:00   0.866025       -0.5  0.887885  0.460065  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Train the pipeline and create features\n",
    "# for the train set:\n",
    "\n",
    "X_train_t = pipe.fit_transform(X_train)\n",
    "\n",
    "# Data with input features.\n",
    "X_train_t.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(6850,)\n",
      "(6427,)\n"
     ]
    }
   ],
   "source": [
    "# Our transformation pipeline removed observations\n",
    "# with missing data, so we need to remove those\n",
    "# observations from the target variable as well.\n",
    "\n",
    "print(y_train.shape)\n",
    "\n",
    "y_train_t = y_train.loc[X_train_t.index]\n",
    "\n",
    "print(y_train_t.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Lasso(random_state=0)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">Lasso</label><div class=\"sk-toggleable__content\"><pre>Lasso(random_state=0)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "Lasso(random_state=0)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Lasso regression\n",
    "\n",
    "lasso = Lasso(random_state=0)\n",
    "\n",
    "# Train the model\n",
    "\n",
    "lasso.fit(X_train_t, y_train_t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1153.64837067, 1033.54156603,  985.74093314, ..., 1343.3048774 ,\n",
       "       1243.24684182, 1168.50421853])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Make predictions\n",
    "\n",
    "preds = lasso.predict(X_train_t)\n",
    "\n",
    "preds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Forecast: train set')"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the predictions vs the truth.\n",
    "\n",
    "plt.scatter(y_train_t, preds)\n",
    "plt.xlabel(\"CO_sensor\")\n",
    "plt.ylabel(\"Predictions\")\n",
    "plt.title(\"Forecast: train set\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "92.21694976514135"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The RMSE in the train set.\n",
    "\n",
    "mean_squared_error(preds, y_train_t, squared=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On the train set, the model seems to be doing a decent job.\n",
    "\n",
    "# Evaluate model\n",
    "\n",
    "We will evaluate the performance of the model in our test set now."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>month</th>\n",
       "      <th>week</th>\n",
       "      <th>day_of_week</th>\n",
       "      <th>day_of_month</th>\n",
       "      <th>hour</th>\n",
       "      <th>weekend</th>\n",
       "      <th>CO_sensor_lag_1H</th>\n",
       "      <th>RH_lag_1H</th>\n",
       "      <th>CO_sensor_lag_24H</th>\n",
       "      <th>RH_lag_24H</th>\n",
       "      <th>CO_sensor_window_3H_mean</th>\n",
       "      <th>RH_window_3H_mean</th>\n",
       "      <th>month_sin</th>\n",
       "      <th>month_cos</th>\n",
       "      <th>hour_sin</th>\n",
       "      <th>hour_cos</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date_Time</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2005-03-04 00:00:00</th>\n",
       "      <td>3</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1179.0</td>\n",
       "      <td>82.0</td>\n",
       "      <td>1047.0</td>\n",
       "      <td>41.7</td>\n",
       "      <td>1223.333333</td>\n",
       "      <td>82.700000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.123234e-17</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2005-03-04 01:00:00</th>\n",
       "      <td>3</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>929.0</td>\n",
       "      <td>37.4</td>\n",
       "      <td>1030.0</td>\n",
       "      <td>43.3</td>\n",
       "      <td>1104.666667</td>\n",
       "      <td>67.300000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.123234e-17</td>\n",
       "      <td>0.269797</td>\n",
       "      <td>0.962917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2005-03-04 02:00:00</th>\n",
       "      <td>3</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>951.0</td>\n",
       "      <td>40.8</td>\n",
       "      <td>986.0</td>\n",
       "      <td>45.9</td>\n",
       "      <td>1019.666667</td>\n",
       "      <td>53.400000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.123234e-17</td>\n",
       "      <td>0.519584</td>\n",
       "      <td>0.854419</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2005-03-04 03:00:00</th>\n",
       "      <td>3</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>938.0</td>\n",
       "      <td>44.2</td>\n",
       "      <td>992.0</td>\n",
       "      <td>49.7</td>\n",
       "      <td>939.333333</td>\n",
       "      <td>40.800000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.123234e-17</td>\n",
       "      <td>0.730836</td>\n",
       "      <td>0.682553</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2005-03-04 04:00:00</th>\n",
       "      <td>3</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>921.0</td>\n",
       "      <td>48.7</td>\n",
       "      <td>1076.0</td>\n",
       "      <td>56.3</td>\n",
       "      <td>936.666667</td>\n",
       "      <td>44.566667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>6.123234e-17</td>\n",
       "      <td>0.887885</td>\n",
       "      <td>0.460065</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     month  week  day_of_week  day_of_month  hour  weekend  \\\n",
       "Date_Time                                                                    \n",
       "2005-03-04 00:00:00      3     9            4             4     0        0   \n",
       "2005-03-04 01:00:00      3     9            4             4     1        0   \n",
       "2005-03-04 02:00:00      3     9            4             4     2        0   \n",
       "2005-03-04 03:00:00      3     9            4             4     3        0   \n",
       "2005-03-04 04:00:00      3     9            4             4     4        0   \n",
       "\n",
       "                     CO_sensor_lag_1H  RH_lag_1H  CO_sensor_lag_24H  \\\n",
       "Date_Time                                                             \n",
       "2005-03-04 00:00:00            1179.0       82.0             1047.0   \n",
       "2005-03-04 01:00:00             929.0       37.4             1030.0   \n",
       "2005-03-04 02:00:00             951.0       40.8              986.0   \n",
       "2005-03-04 03:00:00             938.0       44.2              992.0   \n",
       "2005-03-04 04:00:00             921.0       48.7             1076.0   \n",
       "\n",
       "                     RH_lag_24H  CO_sensor_window_3H_mean  RH_window_3H_mean  \\\n",
       "Date_Time                                                                      \n",
       "2005-03-04 00:00:00        41.7               1223.333333          82.700000   \n",
       "2005-03-04 01:00:00        43.3               1104.666667          67.300000   \n",
       "2005-03-04 02:00:00        45.9               1019.666667          53.400000   \n",
       "2005-03-04 03:00:00        49.7                939.333333          40.800000   \n",
       "2005-03-04 04:00:00        56.3                936.666667          44.566667   \n",
       "\n",
       "                     month_sin     month_cos  hour_sin  hour_cos  \n",
       "Date_Time                                                         \n",
       "2005-03-04 00:00:00        1.0  6.123234e-17  0.000000  1.000000  \n",
       "2005-03-04 01:00:00        1.0  6.123234e-17  0.269797  0.962917  \n",
       "2005-03-04 02:00:00        1.0  6.123234e-17  0.519584  0.854419  \n",
       "2005-03-04 03:00:00        1.0  6.123234e-17  0.730836  0.682553  \n",
       "2005-03-04 04:00:00        1.0  6.123234e-17  0.887885  0.460065  "
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create the input features:\n",
    "\n",
    "X_test_t = pipe.transform(X_test)\n",
    "\n",
    "X_test_t.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Timestamp('2005-03-04 00:00:00'), Timestamp('2005-04-04 14:00:00'))"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Note that the prior 24 hr of information\n",
    "# dissapeared from our test set (they had null data).\n",
    "\n",
    "# Our dataset contains the first forecasting point\n",
    "# as expected.\n",
    "\n",
    "X_test_t.index.min(), X_test_t.index.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1122.2269227 ,  855.95634311,  910.00549256,  931.51941646,\n",
       "        929.00244686,  868.51544281,  849.8519462 ,  907.782453  ,\n",
       "        972.14913519, 1006.27472793])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Make predictions.\n",
    "\n",
    "preds = lasso.predict(X_test_t)\n",
    "\n",
    "preds[0:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(567,)\n",
      "(495,)\n"
     ]
    }
   ],
   "source": [
    "print(y_test.shape)\n",
    "\n",
    "# Adjust the target, it has observations\n",
    "# that were removed from the test set due\n",
    "# to null values.\n",
    "\n",
    "y_test_t = y_test.loc[X_test_t.index]\n",
    "\n",
    "print(y_test_t.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Forecast: test set')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the predictions vs the truth.\n",
    "\n",
    "plt.scatter(y_test_t, preds)\n",
    "plt.xlabel(\"CO_sensor\")\n",
    "plt.ylabel(\"Predictions\")\n",
    "plt.title(\"Forecast: test set\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "95.41416312467017"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# RMSE in test set\n",
    "\n",
    "mean_squared_error(preds, y_test_t, squared=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that our linear regression makes fairly good predictions of the pollutant concentration in the next hour."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "fsml",
   "language": "python",
   "name": "fsml"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "169px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
